#include "systick.h"
#include <stdlib.h>

static volatile uint64_t g_sysRunTime = 0;

static void (*g_pTaskScheduleFunc)(void); // 函数指针变量，保持任务调度的函数地址

/**
 * @brief  注册任务调度函数
 * @param  pFunc: 任务调度函数地址
 * @return 无
 */
void TaskScheduleCbReg(void (*pFunc)(void))
{
    g_pTaskScheduleFunc = pFunc;
}

/**
 * @brief systick初始化
 * @param
 */
void SystickInit(void)
{
    if (SysTick_Config(SystemCoreClock / 1000)) // 1ms中断
    {
        while (1);
    }
}

/**
 * @brief systick中断服务函数,1ms产生一次中断
 * @param
 */
void SysTick_Handler(void)
{
    g_sysRunTime++;
    if (g_pTaskScheduleFunc != NULL)
    {
        g_pTaskScheduleFunc();
    }
}

/**
 * @brief 获取系统运行时间
 * @param
 * @return 返回系统运行时间，单位为ms
 */
uint64_t GetSysRunTime(void)
{
    return g_sysRunTime;
}

void DelayMs(uint32_t ms)
{
    uint32_t start = GetSysRunTime();
    while ((GetSysRunTime() - start) < ms)
    {
    }
}
